#include "my.pb.h"
#include <fstream>

int main()
{
    std::fstream fs("Contacts.bin",std::ios::binary | std::ios::app | std::ios::out|std::ios::in);
    if(!fs.is_open())
    {
        std::cerr<<"文件打开失败\n";
    }
    Person pe;
    pe.ParseFromIstream(&fs);
    fs.close();
    //protobuf里面支持了几种未识别，但是定义的未知字段
// TYPE_VARINT: 变长整型，用于编码如int32、int64、uint32、uint64、sint32、sint64、bool、enum等类型。这种编码方式能够高效地表示较小的数值。

// TYPE_FIXED32: 32位固定大小整型，总是占用4字节，通常用于确切知道大小且对齐有要求的场合，如float。

// TYPE_FIXED64: 64位固定大小整型，总是占用8字节，适合double或者确切需要64位对齐的整数。

// TYPE_LENGTH_DELIMITED: 长度界定类型，先编码一个varint表示后续数据的长度，然后是实际的数据内容。字符串、嵌套的消息体等会使用这种类型编码。

// TYPE_GROUP: 这是一种比较老且已不推荐使用的类型，用于表示嵌套的消息组。在现代的Protobuf使用中，GROUP类型已经很少见，通常推荐使用嵌套message代替。
    const google::protobuf:: Reflection* ref =  Person::GetReflection();
    const google::protobuf::UnknownFieldSet& set = ref->GetUnknownFields(pe);

    for(int i = 0;i<set.field_count();i++)
    {
        const  google::protobuf::UnknownField unk_filed = set.field(i);
        std::cout<<"未知字段"<<i+1 <<":编号："<<unk_filed.number()<<"\n";
        switch(unk_filed.type())
        {
            case google::protobuf::UnknownField::TYPE_VARINT:
                std::cout<<"值："<<unk_filed.varint()<<"\n";
                break;

        }   //剩下几种不多介绍
    }
    return 0;
}